package com.interview;


import java.lang.reflect.Field;

public class IntegerTest {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Integer a = 2,b = 3;//Integer a = Intger.valueOf(2);
        //Integer a = 129,b = 129;
        //System.out.println(a == b);
        System.out.println("交换前:a = " + a +",b = " + b);
        swap(a , b);
        System.out.println("交换后:a = " + a +",b = " + b);
    }

    public static void swap(Integer a, Integer b) throws NoSuchFieldException, IllegalAccessException {
/*        Integer tmp = a;
        a = b;
        b = tmp;
        //这个方案不行,是因为交换的是副本的值。并没有交换原始的值。所以没有完成真正的交换目的
        */

        //利用反射才能修改 private final修饰的变量,getDeclaredFielda方法能拿到成员变量
        Field field = Integer.class.getDeclaredField("value");
        field.setAccessible(true);
        //int tmp = a.intValue();//浅克隆，tmp的值是2,下一行又给a的值变成了3,第三句就b的tmp也就是3了
        //想解决上述问题,重新建对象不能指向一个,对比上面的,与自动装箱有本质的不同,不是用的一个地址的引用
        Integer tmp = new Integer(a.intValue());
        field.set(a, b.intValue());//Integer.valueOf(b.intValue()).intValue()
        field.set(b,tmp);
    }
}
